/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Model.dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import Model.pojo.*;


public class PedidoDao implements InterfacePedidoDao {
	private File arquivo = new File("ListaPedido.txt");
	private ArrayList<Pedido> lista = new ArrayList<Pedido>();
	private long codigo;
	private int quantidade;
	private String cpf;
	private long codigoItem;
	private Pedido pedido;
	//private boolean aux;
	
	private Cliente clienteAux;
	private Item itemAux;
	private ClienteDao cliente;
	private ItemDao item;
	private CompraDao compra;
	
	
	private FileWriter fw;
	private BufferedWriter bw;
	private FileReader fr;
	private BufferedReader br;
	Iterator<Pedido> it;
	Iterator<Item> it2;
	Iterator<Integer> quant;
	
	public PedidoDao (ClienteDao cliente, ItemDao item, CompraDao compra){
		this.cliente = cliente;
		this.item = item;
		this.compra = compra;
	}
	
	
	
	public ArrayList<Pedido> getLista() {
		return lista;
	}



	//Ler do arquivo e quando encontrar a palavra pedido no arquivo vai para o proximo pedido
	public ArrayList<Pedido> ler() throws IOException{
		if(arquivo.exists() == false){
			arquivo.createNewFile();
			return lista;
		}
		String aux;
		fr = new FileReader (arquivo);
		br = new BufferedReader (fr);
		while (br.ready()){
			aux = br.readLine();
			if(aux.equals("Pedido")){
				codigo = Long.parseLong(br.readLine());
				cpf = br.readLine();
				codigoItem =  Long.parseLong(br.readLine());
				quantidade = Integer.parseInt(br.readLine());
				iniciarPedido (codigo, quantidade, cpf, codigoItem);
			}
			else{
				codigoItem =  Long.parseLong(aux);
				quantidade = Integer.parseInt(br.readLine());
				verificar(codigoItem).addQuantidade(quantidade);
				itemAux = item.verificar(codigoItem);
				verificar(codigoItem).addItens(itemAux);
			}
		}
		br.close();
		fr.close();
		return lista;
	}
	
	//vai iniciar um pedido a cada pedido(vetor de pedidos)
	public void iniciarPedido (long codigo, int quantidade, String cpf, long codigoItem){
		clienteAux = cliente.verificar(cpf);
		itemAux = item.verificar(codigoItem);
		lista.add(new Pedido(codigo, clienteAux, itemAux, quantidade));
		}
	
	public void adicionarNoPedido (long codigo, int quantidade, long codigoItem){
		Pedido pedido = verificar(codigo);
		pedido.addItens(item.verificar(codigoItem));
		pedido.addQuantidade(quantidade);
	}
	
	//Verificar
	public Pedido verificar (long codigo){
		if (lista.isEmpty() == true) return null;
		it = lista.iterator();
		while (it.hasNext()) {  
			Pedido aux = it.next();  
		    if (aux.getCodigo()== codigo){  
		        return aux;
		   }  
		}
		return null;
	}

	//Exclui da memoria, só vai excluir do arquivo quando sair do programa(salvar)
	public ArrayList<Pedido> excluir(long codigo) { 
		if ( pedido == null || lista.isEmpty() == true) return lista;
		it = lista.iterator();
		if (lista.get(0).getCodigo() == codigo){
			lista.remove(0);
		}
		else{
			while (it.hasNext()){
				if (it.next().getCodigo() == codigo){
					it.remove();	
					break;
				}
			}
		}
		return lista;	
	}
	
	public void finalizarPedido(Pedido pedido){
		compra.realizarCompra(pedido);
		lista = excluir(pedido.getCodigo());
	}
	
	//Salvar
	public boolean salvar(Pedido pedido) throws IOException{
		if (pedido == null) return false;
		fw = new FileWriter(arquivo, true);
		bw = new BufferedWriter (fw);
		bw.write("Pedido");
		bw.newLine();
		bw.write(""+pedido.getCodigo());
		bw.newLine();
		bw.write(""+pedido.getCliente().getCpf());
		bw.newLine();
		it2 = (pedido.getItens()).iterator();
		quant = pedido.getQuantidades().iterator();
		while (it2.hasNext() && quant.hasNext()) {  
			bw.write(""+(it2.next().getCodigo()));
			bw.newLine();
			bw.write(""+(quant.next()));
			bw.newLine();
		}
		bw.close();
		fw.close();
		return true;
	}
	
	public boolean salvar(ArrayList<Pedido> lista) throws IOException{

		if (lista.isEmpty() == true) return false;
		fw = new FileWriter(arquivo);
		it = lista.iterator();
		while (it.hasNext()) {  
		    salvar(it.next());
		}
		return true;
	}

	public long gerarCodigo (){
		if (lista.isEmpty() == true) return 1;
		return (lista.get(lista.size()-1).getCodigo())+1;
	}
}